package ScalaStudy.chapter09plus

object Test02_Implicit {
  def main(args: Array[String]): Unit = {


    //////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////  隐式函数  ///////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////


//    val new12 = new MyRichInt(12)
//    println(new12.myMax((15)))

    println("============ 隐式函数的应用 =============")

    //自定义一个类

    class MyRichInt(val self: Int){
      //自定义比较大小的方法
      def myMax(n: Int): Int = if (n < self) self else n
      def myMin(n: Int): Int = if (n < self) n else self
    }

    //第一步，隐式函数定义
    implicit def convert(num: Int):MyRichInt = new MyRichInt(num)  //直接将Int参数转换成类

    //第二步直接声明
    println(12.myMax(15))        //如果通不过编译，那么进行二次编译，把12转换成引入12的类


    //////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////  隐式类  ////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////

    println("============ 隐式类的应用 =============")

    //定义隐式类
    implicit class MyRichInt1(val self: Int){
      //自定义比较大小的方法
      def myMax1(n: Int): Int = if (n < self) self else n
      def myMin1(n: Int): Int = if (n < self) n else self
    }

    println(12.myMax1(15))


    //////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////  隐式参数  ///////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////


    println("============ 隐式参数的应用 =============")

    implicit val str: String = "alice"                    //隐式参数的定义，默认传递这个参数
//    implicit val str2: String = "alice2"                //不能在同一作用域下定义相同类型的隐式参数，编译器会混淆


    def sayHello(implicit name: String): Unit = {         //编译器会在上下文中找符合参类型的值
      println("hello, " + name)
    }
    def sayHi(implicit name: String = "wq") : Unit = {   //隐式参数优先级高于默认参数
      println("hi, " + name)
    }

    sayHello
    sayHi

    println("============ 隐式参数的简便写法 =============")

    implicit val age: Int = 18

    def hiAge(): Unit = {                    //不传参数
      println("hi, " + implicitly[Int])      //在函数体中声明想要一个Int的泛型
    }

    hiAge



  }
}











